package com.lz.all;

/**
 * DecoratorDemo.. 原对象 ，增强
 *
 * //静态代理类
 *
 * //静态代理类与装饰者之间的共同点：
 *
 * //（1）都要实现与目标类相同的业务接口（2）在俩个类中都要声明目标对象（3）都可以在不修改目标类的前提下增强目标方法
 *
 * //静态代理类与装饰者，之间的不同点：
 *
 * //（1）目的不同，装饰者，简单说，就是为了增强目标对象
 *
 * // 静态代理的使用目的是为了保护和隐藏目标对象
 *
 * //（2）对于目标对象的获取方式不同
 *
 * //装饰者中目标对象的获取，通过代参构造器传入，静态代理类中，是在无参构造器中直接创建。
 *
 * //(3)功能增强的实现者不同 装饰者设计模式中存在装饰者基类，其并不能实现增强，而是由具体的装饰者进行增强的，所以其存在着"装饰者链"
 *
 * //而静态代理中，一般不存在父子类的关系，具体的增强，就是由代理类实现的。无需其子类完成，所以不存在链 的概念。

 *
 * @author Lizhong
 * @date 2019/5/8
 */
public class DecoratorDemo {
    public static void main(String[] args) {
        // 获取原对象
        TestImp testImp = new TestImp();
        // 增强1
        TestWrapper01 testWrapper01 = new TestWrapper01(testImp);
        // 增强2
        TestWrapper02 testWrapper02=new TestWrapper02(testWrapper01);
        // over
        testWrapper02.sout();
    }
}
/**
 * 原接口
 */
interface Test {
    void sout();
}

class TestImp implements Test {

    @Override
    public void sout() {
        System.out.println("装饰器");
    }
}

/**
 * 增强1
 */
class TestWrapper01 implements Test {
    private Test test;

    public TestWrapper01(Test test) {
        this.test = test;
    }

    @Override
    public void sout() {
        System.out.println("增强1");
        test.sout();
    }
}

/**
 * 增强2
 */
class TestWrapper02 implements Test {
    private Test test;

    public TestWrapper02(Test test) {
        this.test = test;
    }

    @Override
    public void sout() {
        System.out.println("增强2");
        test.sout();
    }
}

